﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using VentaElectrodomesticos.Contrato;
using VentaElectrodomesticos.Negocio;
using VentaElectrodomesticos.Datos;
using VentaElectrodomesticos.GUI.Base;
using VentaElectrodomesticos.GUI.Helpers;

namespace VentaElectrodomesticos.GUI.AbmProducto
{
    public partial class FormAbmProducto : BaseListado<ProductoNegocio,FormProducto,ProductoDAO,Producto>
    {
        private static FormAbmProducto instance;
        private List<Categoria> categorias = new List<Categoria>();
        public long sucursal_id { get; set; }
        public static FormAbmProducto getInstance()
        {
            if (instance == null)
                instance = new FormAbmProducto();
            instance.BringToFront();
            return instance;
        }

        public FormAbmProducto()
        {
            InitializeComponent();
            this.categorias = new CategoriaNegocio().getAll();
            TreeBuilder treeBuilder = new TreeBuilder(this.categorias, treeCategorias);
            treeBuilder.buildTree();
        }        

        protected override DataGridView DgList
        {
            get
            {
                return this.dgListClientes;
            }
        }

        protected override Producto getFilter()
        {
            Producto productoFilter = new Producto();
            if (!String.IsNullOrEmpty(textCodigo.Text))
            {
                productoFilter.Id = Convert.ToInt32(textCodigo.Text);
            }
            productoFilter.Nombre = tbFilterNombre.Text;
            productoFilter.Marca = tbMarcaFilter.Text;
            productoFilter.__precioMax = getPrecioMaxFilter();
            productoFilter.__precioMin = getPrecioMinFilter();
            productoFilter.Categoria_Id = getCategoria();
            return productoFilter;
        }

        protected override void limpiar()
        {
            this.textCodigo.Text = null;
            this.tbFilterNombre.Text = null;
            this.tbMarcaFilter.Text = null;
            this.tbPrecioMinFilter.Text = null;
            this.textPrecioMaximo.Text = null;
            this.treeCategorias.SelectedNode = null;

            base.limpiar();
        }

        private int? getCategoria()
        {
            if (treeCategorias.SelectedNode != null)
                return Convert.ToInt32(treeCategorias.SelectedNode.Tag);
            return null;
        }

        private Decimal? getPrecioMinFilter()
        {
            try
            {
                return Decimal.Parse(tbPrecioMinFilter.Text);                
            }
            catch (FormatException)
            {
                return default(Decimal?);
            }
        }

        private Decimal? getPrecioMaxFilter()
        {
            try
            {
                return Decimal.Parse(textPrecioMaximo.Text);
            }
            catch (FormatException)
            {
                return default(Decimal?);
            }
        }

        private void tbFilterNombre_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
                base.filter();                
        }

        protected override void initTable(DataGridView table)
        {
            table.Columns["Categoria_Id"].Visible = false;
            table.Columns["__cantidad"].Visible = false;
            table.Columns["__total"].Visible = false;
            table.Columns["descripcion"].Visible = false;
            table.Columns["__precioMax"].Visible = false;
            table.Columns["__precioMin"].Visible = false;

            table.Columns["id"].Visible = true;
            table.Columns["id"].HeaderText = "Codigo";
        }

        protected override void initForm(FormProducto formProducto)
        {
            formProducto.setCategorias(this.categorias);
        }

        protected override void OnClosed(EventArgs e)
        {
            instance = null;
            base.OnClosed(e);
        }

        protected override void cumpleValidaciones()
        {
            if (treeCategorias.SelectedNode != null && treeCategorias.SelectedNode.Nodes.Count != 0)
            {
                this.Errores.Add("La categoria seleccionada no es valida.");
            }
            if (!(RegCondition.Condition(tbFilterNombre, RegCondition.RegularExpressions.Alphabet) || tbFilterNombre.Text == ""))
                this.Errores.Add("El apellido no es válido");
            if (!(RegCondition.Condition(tbMarcaFilter, RegCondition.RegularExpressions.Alphabet) || tbMarcaFilter.Text == ""))
                this.Errores.Add("La marca no es valida");
            if (!(RegCondition.Condition(textCodigo, RegCondition.RegularExpressions.Numeric) || textCodigo.Text == ""))
                this.Errores.Add("El codigo no es valido");
            decimal a;
            if (!(Decimal.TryParse(textPrecioMaximo.Text, out a) || textPrecioMaximo.Text == ""))
                this.Errores.Add("El precio maximo no es valido");
            decimal b;
            if (!(Decimal.TryParse(tbPrecioMinFilter.Text, out b) || tbPrecioMinFilter.Text == ""))
                this.Errores.Add("El precio minimo es valido");
        }

        protected override List<Producto> getObjectList()
        {
            if (this.IsSearchForm)
            {
                return this.Negocio.getAllActives();
            }
            else {
                return base.getObjectList();
            }
        }

        protected override List<Producto> getFilteredObjectList(Producto filter)
        {
            if (this.IsSearchForm)
            {
                filter.inactivo = false;
            }

            return base.getFilteredObjectList(filter);
        }
    }
}
